![ALB への IP アドレス直指定によるアクセスをブロックしたい](https://devio2023-media.developers.io/wp-content/uploads/2019/05/aws-waf.png)
ALB への IP アドレス直指定によるアクセスをブロックしたい
困っていた内容
ALB へ、http(s)://<IP アドレス>/~ のように、ドメインではなく IP アドレスを指定したリクエストがきたときにブロックすることが夢です。
この夢を実現するにはどうすればいいでしょうか。
どうすればいいの?
とてもステキな夢をお持ちですね。
結論としては、AWS WAFv2 を利用して実現することができます。
以下、検証したときの流れを書いていきます。
やってみた
ALB の作成と設定
始めに、ALB を作成しました。ステキな ALB になってほしいという願いをこめて「suteki-alb」と名付けました。
ちなみにリージョンはオレゴンを使っています。オレゴンは風光明媚ないいところです。行ったことはありませんが。
さて、次に ALB のリスナーを設定します。今回は、HTTP:80 で固定レスポンスを返すように設定しました。
アクセスに成功すると、作られては削除されるテストページの悲哀を感じさせるメッセージが表示されます。
それから、セキュリティグループのインバウンドルールを、HTTP でインターネットからアクセスできるように設定しました。
一旦、この状態で動作確認をしてみます。
まずは、ALB の DNS 名でアクセスしてみます。
アクセスできました。
つづいて、IP アドレスでアクセスしてみます。
ALB の IP アドレスは、dig コマンドで確認しました。
「34.215.155.15」を指定して ALB へアクセスしてみました。
アクセスできました。
DNS名でも IP アドレスでも ALB へアクセスできることが確認できましたが、今回は、IP アドレスでアクセスされた場合はブロックしたいので、IP アドレスでアクセスされたということを判定する必要があります。どうすれば判定できるでしょうか。
それを調べるためにブラウザの開発者ツールで、DNS名でアクセスした場合、IP アドレスでアクセスした場合のそれぞれのリクエストヘッダーの内容を比較してみました。
どうやら Host ヘッダーに DNS名や IP アドレスが入るようなので、ここで判定できそうな気がします。
本当にそうなのか、念の為、ALB のもう一つの IP アドレス「35.155.253.46」でアクセスしたときのリクエストヘッダーも確認してみました。
やはり Host ヘッダーに IP アドレスが入っていました。
この結果から、Host ヘッダーに IP アドレスが入っているリクエストをブロックするように設定すればいいようです。
ALB のホストベースルーティングの機能を使えば、Host ヘッダーに ALB の IP アドレスが入っている場合はエラーページへルーティングするといったことは可能ですが、ブロックすることはできません。
そこで、AWS WAFv2 を利用します。
WAFv2 の「IP セット一致ルールステートメント」では、HTTP リクエストヘッダーに含まれる IP アドレスに基づいてリクエストをブロックすることができます。通常は、X-Forwarded-For ヘッダーを使用するようですが、ほかのヘッダーも使用できます。
とりあえず、この方法で試してみました。
WAFv2 の設定(IP セット一致ルールステートメント)
まず、ALB の IP アドレスの一つ「34.215.155.15」を含む IP セットを作りました。
この IP セットを指定して、次の画像のような設定で WEB ACL にルールを追加しました。
最終的には、次の画像のような設定で WEB ACL を作成しました。
この WEB ACL を ALB に関連付けました。
この状態で ALB の IP アドレス「34.215.155.15」へアクセスすると...
ブロックされました!
しかし、当然のことながら、IP セットに含めていないもう一つの ALB の IP アドレス 「35.155.253.46」でアクセスした場合は、ブロックされません。
「35.155.253.46」も IP セットに含めればいいように思いますが、ALB の IP アドレスは変わることがあります。
ALB の IP アドレスが変わって、その変わった IP アドレスでアクセスされたときもブロックされるようにしたいです。 欲が深いですね。
というわけで、別の方法を試してみました。
WAFv2 の設定(正規表現パターンセット一致ルールステートメント)
「正規表現パターンセット一致ルールステートメント」について、ドキュメントにはこう書かれています。
正規表現パターンセット一致は、ウェブリクエストの指定した部分を、正規表現パターンセット内の指定した正規表現パターンに照らして検査します。
今回の場合、「ウェブリクエストの指定した部分」は「リクエストヘッダーの Host ヘッダー」で、「正規表現パターンセット内の指定した正規表現パターン」は 「IP アドレスの正規表現パターン」ということになりますね。
というわけで、次の画像のように「IP アドレスの正規表現パターン」を持つ正規表現パターンセットを作成しました。
これを、次の画像のようなルール設定で、WEB ACL に追加しました。
先に検証した「IP セット一致ルールステートメント」を使用したルールは削除し、WEB ACL には、「正規表現パターンセット一致ルールステートメント」を使用したルールのみがある状態にしました。
この状態で ALB の IP アドレス「34.215.155.15」へアクセスすると...
ブロックされました!
もう一つの IP アドレス「35.155.253.46」でもアクセスしてみます。
ブロックされました!
これなら ALB の IP アドレスが変わってもブロックできそうです。
まとめ
ブロックしたい ALB へのアクセスがあるときは、リクエストヘッダーの内容を確認して、WAFv2 でブロックできないか、試してみるとよいと思います。
参考資料
[新機能]EC2やS3不要!ALBだけでメンテナンス画面を表示するなど固定レスポンスが返せるようになりました!